package com.swak.telnet.cmd;

import java.util.List;

import com.swak.utils.Lists;
import com.swak.utils.StringUtils;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Getter
@Setter
@Accessors(chain = true)
public class Option {

	private String name;
	private List<Object> values = Lists.newArrayList();

	public Option addValue(Object value) {
		if (value != null) {
			values.add(value);
		}
		return this;
	}

	@Override
	public int hashCode() {
		return name.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		return name.equals(((Option) obj).name);
	}

	public Long getLong() {
		return values.isEmpty() ? null
				: (values.get(0) instanceof Long ? (Long) values.get(0)
						: Long.parseLong(String.valueOf(values.get(0))));
	}

	public Byte getByte() {
		return values.isEmpty() ? null
				: (values.get(0) instanceof Byte ? (Byte) values.get(0)
						: Byte.parseByte(String.valueOf(values.get(0))));
	}

	public Boolean getBoolean() {
		return values.isEmpty() ? null
				: (values.get(0) instanceof Boolean ? (Boolean) values.get(0)
						: Boolean.parseBoolean(String.valueOf(values.get(0))));
	}

	public String getString() {
		return values.isEmpty() ? null : StringUtils.join(values, StringUtils.SPACE);
	}

	@Override
	public String toString() {
		return "-" + name + StringUtils.SPACE + StringUtils.join(values, StringUtils.SPACE);
	}

	public static Option of(String name) {
		return new Option().setName(name);
	}

	public static Option of(String name, Object value) {
		return new Option().setName(name).addValue(value);
	}
}
